﻿using System.Collections.Generic;

namespace FibMatrix
{
    [FM_Mono.IgnoreGen]
    public enum AssetBundleUrlMode
    {
        NotSure,
        Local,
        Remote
    }

    /// <summary>
    /// 表示资源信息（基类）及其对应的bundle信息
    /// 
    /// 多个直接加载资源在一个bundle时在AssetList中有多个项，每项都有一个本类对象，
    /// </summary>
    [FM_Mono.IgnoreGen]
    internal class AssetBundleLoadItem : AbstractLoadItem
    {
        public AssetBundleLoadItem(string assetId, BundleInfo bundleInfo) : base(assetId)
        {
            this.bundleInfo = bundleInfo;
        }

        public BundleInfo bundleInfo { get; private set; }

        public BundleLoadHandle bundleHandle
        {
            get { return bundleInfo.bundleHandle; }
            set { bundleInfo.bundleHandle = value; }
        }
    }

    /// <summary>
    /// 表示一个文件
    /// 是bundle时，有bundle的加载信息：依赖、计数等。一个bundle只有一个此对象
    /// 也可以表示一般文件，比如mp3, mp4
    /// </summary>
    internal class BundleInfo
    {
        public AssetBundleUrlMode urlMode;

        public BundleLoadHandle bundleHandle;

        /// <summary>
        /// 每次从bundle中加载一种资源需要加一次计数，释放那种资源也减一次
        /// 同一资源不应该加、减多次
        /// </summary>
        public int bundleRefCount;

        public List<BundleInfo> dependence; // 直接依赖
        public List<BundleInfo> flatDependence; // 全部依赖

        public AssetNode node { get; private set; }
        public string url => node.url;
        public string md5 => node.md5;

        public BundleInfo(AssetNode n)
        {
            urlMode = AssetBundleUrlMode.NotSure;
            bundleRefCount = 0;
            node = n;
        }
    }
}